/* sig.c */
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<wait.h>
#include<stdlib.h>
#include<sys/types.h>

// 定义SIGCHLD信号的处理函数
void sigchld_handler(int sig) {
    int status; // 用于存储子进程的退出状态
    pid_t pid = waitpid(-1, &status, WNOHANG); // 非阻塞地等待任一子进程，获取其状态
    if (WIFEXITED(status)) { // 判断子进程是否正常退出
        printf("child process exited normally\n");
    } else if (WIFSIGNALED(status)) { // 判断子进程是否因接收到信号而退出
        printf("child process exited abnormally\n");
    } else if (WIFSTOPPED(status)) { // 判断子进程是否已停止
        printf("child process is stopped\n");
    } else {
        printf("else\n"); // 其他情况
    }
}

int main() {
    pid_t pid; // 用于存储进程ID
    
    // 注册SIGCHLD信号的处理函数
    signal(SIGCHLD, sigchld_handler);
    
    // 创建子进程
    pid = fork();
    
    if (pid == 0) {
        abort(); // 子进程调用abort异常退出
    } else if (pid > 0) {
        sleep(2); // 父进程等待2秒，确保子进程有机会执行
        printf("parent process\n"); // 打印父进程信息
    } else {
        exit(0); // fork失败，退出程序
    }
    
    return 0;
}


